home *** CD-ROM | disk | FTP | other *** search
/ The Fatted Calf / The Fatted Calf.iso / Applications / Clocks / DockClock / Source / Clock.m < prev    next >
Text File  |  1992-12-19  |  9KB  |  380 lines

  1.  
  2. /* Generated by Interface Builder */
  3.  
  4. #import "Clock.h"
  5. #import <appkit/Application.h>
  6. #import <appkit/NXImage.h>
  7. #import <appkit/View.h>
  8. #import <soundkit/Sound.h>
  9. #import <sys/time.h>
  10. #import <math.h>
  11. #import <dpsclient/wraps.h>
  12. #import <appkit/Font.h>
  13. #import <string.h>
  14.  
  15. #define STANDARD 3
  16. #define ANALOG 4
  17. #define GRANITE 5
  18. #define DIGITAL 1
  19. #define DIAGNAL 2
  20. #define NUMBERED 6
  21. #define BLACK 7
  22. #define FIRST DIGITAL
  23. #define LAST BLACK
  24. #define MAX (LAST - FIRST + 2)
  25.  
  26. #define WDIAG (64.0 * sqrt(2.0))
  27.  
  28.  
  29. NXPoint zero = {0.0, 0.0};
  30.  
  31. NXRect rect;    // Sort of a do everything kind of Rectangle
  32. NXRect inside = { 0.0,0.0,64,64};
  33.  
  34.  
  35. @implementation Clock
  36.  
  37. - setUpIcon 
  38. {
  39.     int startover;
  40.     NXSize size = { 64.0, 64.0 };
  41.  
  42.     [self lockFocus];
  43.     [back composite:NX_COPY toPoint:&zero];
  44.  
  45. do {
  46.     startover = 0;
  47.     switch(ctype) {
  48.     case DIGITAL:
  49.         PSsetgray(NX_BLACK);
  50.         tFont = [Font newFont:"Times-Roman"
  51.             size:18 style:0
  52.             matrix:NX_IDENTITYMATRIX];
  53.         dFont = [Font newFont:"Helvetica"
  54.             size:8 style:0
  55.             matrix:NX_IDENTITYMATRIX];
  56.         image = [image free];    // This doesn't need an image
  57.         break;
  58.  
  59.     case DIAGNAL:
  60.         PSsetgray(NX_BLACK);
  61.         tFont = [Font newFont:"Times-Roman" 
  62.             size:30.0 style:0
  63.             matrix:NX_IDENTITYMATRIX];
  64.         [self setSeconds:NO];
  65.         image = [image free];
  66.         break;
  67.     default:
  68.         if (image) image = [image free];
  69. #ifdef BAD
  70.         image = [NXImage findImageNamed:[self getSectionName:ctype]];
  71. #else
  72.         image = [[NXImage alloc] initFromSection:[self getSectionName:ctype]];
  73.         [image setScalable:YES];
  74.         [image setSize:&size];
  75. #endif
  76.  
  77. #ifdef BAD
  78.         if (image == nil)
  79. #else
  80.         if (![image composite:NX_SOVER toPoint:&zero])
  81. #endif
  82.         {
  83.         ctype = FIRST;
  84.         startover = YES;
  85.         }
  86.         break;
  87.     }
  88. } while (startover == YES);
  89.  
  90.     [self unlockFocus];
  91.     return self;
  92. }
  93. - init
  94. {
  95.     [super initFrame:&inside];
  96.     [self setOpaque:YES];
  97.     back = [[NXImage alloc] initFromSection:"blank"];
  98.     timer = DPSAddTimedEntry(1.0, doStep, self, NX_BASETHRESHOLD);
  99.     return self;
  100. }
  101.  
  102. - free
  103. {
  104.     [image free];
  105.     [back free];
  106.     DPSRemoveTimedEntry(timer);
  107.     [snd free];
  108.     [tFont free];
  109.     [dFont free];
  110.     return [super free];
  111. }
  112.  
  113. - setType:(int)TYPE;
  114. {
  115.     ctype = TYPE;
  116.     [self setUpIcon];
  117.     return self;
  118. }
  119.  
  120. - (int)getType
  121. {
  122.     return (ctype);
  123. }
  124.  
  125. float centerstring(id theFont, char *theString, float width)
  126. {
  127.     return ((width / 2.0) - ([theFont getWidthOf:theString] / 2.0));
  128. }
  129.  
  130. - (const char *)getSectionName:(int)TYPE
  131. {
  132.     static char tmp[10];
  133.  
  134.     switch(TYPE) {
  135.     case STANDARD:
  136.         return ("standard.tiff");
  137.         break;
  138.     case ANALOG:
  139.         return ("analog.tiff");
  140.         break;
  141.     case GRANITE:
  142.         return ("granite.tiff");
  143.         break;
  144.     case DIGITAL:
  145.         return ("digital.tiff");
  146.         break;
  147.     case DIAGNAL:
  148.         return ("diagnal.tiff");
  149.         break;
  150.     case NUMBERED:
  151.         return ("analognumber.tiff");
  152.         break;
  153.     case BLACK:
  154.         return ( "black.tiff");
  155.         break;
  156.     }
  157.     sprintf(tmp,"%d.tiff",TYPE - MAX + 1);
  158.     return (tmp);    // I don't know what it so return it
  159.  
  160. }
  161.  
  162. void doStep(DPSTimedEntry teNum, double now, void *userData)
  163. {
  164.     [(id)userData display];
  165. }
  166.  
  167. -drawSelf:(const NXRect *)rectangle :(int)rectCount
  168. {
  169.  
  170. #define HOUR 15.0
  171. #define MIN  22.0
  172. #define SEC  24.0
  173.  
  174.     struct tm *curTime; 
  175.     long theTime;
  176.     int min, hour, sec, yy, dd, mm, day;
  177.     float secang, minang, hourang;
  178.     char *month[12] = { "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC" };
  179.     char *Day[7] = { "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT" };
  180.     char tmp[80], ap[3];
  181.  
  182.     // find the current time
  183.     time(&theTime); curTime = localtime(&theTime);
  184.  
  185.     // set the variables equal to the current time
  186.     sec = curTime->tm_sec; hour = curTime->tm_hour; min = curTime->tm_min;
  187.     yy = curTime->tm_year; dd = curTime->tm_mday; mm = curTime->tm_mon;
  188.     day = curTime->tm_wday;
  189.  
  190.     if (min == 0 && sec == 0 && Cflag)
  191.     [snd play]; 
  192.  
  193.     [back composite:NX_COPY toPoint:&zero];
  194.     if (image) [image composite:NX_SOVER toPoint:&zero];
  195.     switch(ctype) {
  196.     case STANDARD:
  197.         if (Mflag)
  198.         if (Sflag) sprintf(tmp,"%02d:%02d:%02d",hour,min,sec);
  199.         else sprintf(tmp,"%02d:%02d",hour,min);
  200.         else {
  201.         if (hour<12) {
  202.             sprintf(ap,"am");
  203.             if (hour == 0) hour = 12;
  204.         } else {
  205.             sprintf(ap,"pm");
  206.             if (hour > 12) hour -= 12;
  207.         }
  208.         sprintf(tmp,"%d:%02d %s",hour,min,ap);
  209.         }
  210.         tFont = [Font newFont:"Times-Italic"
  211.             size:14 style:0
  212.             matrix:NX_IDENTITYMATRIX];
  213.         [tFont set];    // Need to get the current context
  214.         PSsetgray(NX_WHITE);
  215.         PSmoveto(centerstring(tFont,tmp,64.0),47);
  216.         PSshow(tmp);
  217.         PSsetgray(NX_BLACK);
  218.         dFont = [Font newFont:"Helvetica"
  219.         size:8 style:0
  220.         matrix:NX_IDENTITYMATRIX];
  221.         [dFont set];
  222.         PSmoveto(centerstring(dFont,Day[day],64.0),34.0);
  223.         PSshow(Day[day]);
  224.         dFont = [Font newFont:"Times-Roman"
  225.         size:24 style:0
  226.         matrix:NX_IDENTITYMATRIX];
  227.         [dFont set];
  228.         sprintf(tmp,"%d",dd);
  229.         PSmoveto(centerstring(dFont,tmp,64.0),17);
  230.         PSshow(tmp);
  231.         dFont = [Font newFont:"Helvetica-Oblique"
  232.         size:9 style:0
  233.         matrix:NX_IDENTITYMATRIX];
  234.         [dFont set];
  235.         PSmoveto(centerstring(dFont,month[mm],64.0),10);
  236.         PSshow(month[mm]);
  237.  
  238.         break;
  239.     case DIGITAL:
  240.         if (Mflag)
  241.         if (Sflag) sprintf(tmp,"%d:%02d:%02d",hour,min,sec);
  242.         else sprintf(tmp,"%d:%02d",hour,min);
  243.         else {
  244.         if (hour>12) hour = hour - 12;
  245.         if (hour==0) hour = 12;            // Better way?
  246.         if (Sflag) sprintf(tmp,"%d:%02d:%02d",hour,min,sec);
  247.         else sprintf(tmp,"%d:%02d",hour,min);
  248.         }
  249.         [tFont set];
  250.         PSmoveto(centerstring(tFont,tmp,64.0),26.0);
  251.         PSshow(tmp);
  252.         sprintf(tmp,"%s %s %d",Day[day],month[mm],dd);
  253.         [dFont set];
  254.         PSmoveto(centerstring(dFont,tmp,64.0),19.0);
  255.         PSshow(tmp);
  256.         break;
  257.     case DIAGNAL:
  258.         if (!Mflag) {
  259.         if (hour>12) hour = hour - 12;
  260.         if (hour==0) hour = 12;            // Better way?
  261.         }
  262.         sprintf(tmp,"%d:%02d",hour,min);
  263.         [tFont set];
  264.         PSrotate(45.0);
  265.         PSmoveto(centerstring(tFont,tmp,(float) WDIAG), -8.7);
  266.         PSshow(tmp);
  267.         break;
  268.     default:    // This is where the analog clocks are handled
  269. // Thanks to Scott Hess for the formulas.  I was too lazy to figure them out.
  270.         secang = (float)(sec*6*M_PI/180.0);
  271.         minang = (float)(min*6*M_PI/180.0);
  272.         hourang= ((hour)%12)*30*M_PI/180.0+minang/12;
  273.  
  274.         PStranslate(32.0, 32.0);
  275.     if (!Bflag) {    
  276.         if (Sflag) {
  277.         PSsetlinewidth(0.0);
  278.         if (ctype == GRANITE) PSsetgray(NX_WHITE);
  279.         else if (ctype == BLACK) PSsetgray(NX_DKGRAY);
  280.         else PSsetgray(NX_DKGRAY);
  281.         PSmoveto(0.0,0.0);
  282.         PSlineto(sin(secang)*SEC, cos(secang)*SEC);
  283.         PSstroke();    // All of these strokes are needed since each of the lines is different
  284.         }
  285.  
  286.         // Draw the minute hand
  287.         if (ctype == BLACK) PSsetgray(NX_LTGRAY);
  288.         else PSsetgray(NX_BLACK);
  289.         PSsetlinewidth(0.0);
  290.         PSmoveto((float)sin( minang)*MIN, (float)cos( minang)*MIN);
  291.         PSlineto(0.0, 0.0);
  292.         PSstroke();
  293.  
  294.         // Draw the hour hand
  295.         PSsetlinewidth(1.5);
  296.         PSmoveto(0.0, 0.0);
  297.         PSlineto(sin(hourang)*HOUR,cos(hourang)*HOUR);
  298.     } else {
  299.         /* More code from Scott Hess' Clocks program  */
  300.         PSsetlinewidth(0.0);
  301.         if (ctype == BLACK) PSsetgray(NX_LTGRAY); 
  302.         else PSsetgray(NX_BLACK);
  303.         PSmoveto(sin (minang)*MIN, cos(minang)*MIN);
  304.         if (Sflag)
  305.         PScurveto(0,0,0,0,sin(secang)*SEC,cos(secang)*SEC);
  306.         PScurveto( 0,0,0,0,sin(hourang)*HOUR,cos(hourang)*HOUR);
  307.         PScurveto( 0,0,0,0,sin(minang)*MIN,cos(minang)*MIN);
  308.     }
  309.     PSstroke();
  310.     PStranslate(-32.0, -32.0);
  311.         
  312.     break;
  313.     }
  314.     return self;
  315. }
  316.  
  317. - setMilitary:(BOOL)flag
  318. {
  319.     Mflag = flag;
  320.     return self;
  321. }
  322.  
  323. - (BOOL)getMilitary
  324. {
  325.     return Mflag;
  326. }
  327.  
  328. - setSeconds:(BOOL)flag
  329. {
  330.     float timeOut;
  331.  
  332.     // Must always set the seconds even if you want them off.  This is where the timer is done
  333.     Sflag = flag;
  334.     if (Sflag)
  335.     timeOut = 1.0;
  336.     else
  337.     timeOut = 60.0;
  338.  
  339.     if (timer != NULL) DPSRemoveTimedEntry(timer);  // I don't know what a bunch of these buggers will do
  340.     timer = DPSAddTimedEntry(timeOut,doStep,self,NX_BASETHRESHOLD);
  341.     
  342.     return self;
  343. }
  344.  
  345. - (BOOL)getSeconds
  346. {
  347.     return Sflag;
  348. }
  349.  
  350. - setChime:(BOOL)flag
  351. {
  352.     Cflag = flag;
  353.     return self;
  354. }
  355.  
  356. - (BOOL)getChime;
  357. {
  358.     return Cflag;
  359. }
  360.  
  361. - setBezier:(BOOL)flag
  362. {
  363.     Bflag = flag;
  364.     return self;
  365. }
  366.  
  367. - (BOOL)getBezier;
  368. {
  369.     return Bflag;
  370. }
  371.  
  372. - setChimeFile:(char *)file;
  373. {
  374.     snd = [Sound removeSoundForName:"chime"];
  375.     snd = [Sound addName:"chime" fromSoundfile:file];
  376.     return self;
  377. }
  378.  
  379. @end
  380.